
package limfic.servicios.jugador;

import limfic.dominio.Jugador;
import limfic.dominio.Direccion;
import limfic.dominio.Ciudad;
import limfic.servicios.ServicioException;
import limfic.ui.IUsuarioInterfazJugador;
import limfic.persistencia.AbstractDB;
import limfic.persistencia.mysql.jugador.IJugadorRepositorio;
import limfic.persistencia.RepositorioException;
import java.util.Date;
import java.util.List;
/**
 * Esta clase implementa todas las operaciones de las interfaces del jugador
 * @author OpenCodes (Nicolas Tenca, Luis Soto)
 *
 * @see IJugadorServicio
 */
public class JugadorServicio implements IJugadorServicio{

    private AbstractDB fabricaDb;
    @Override
    public void init(IUsuarioInterfazJugador ui) {
        fabricaDb = AbstractDB.getInstance();
    }

    @Override
    public void agregar(IUsuarioInterfazJugador ui) throws ServicioException {
        try {
            int id = 0; // id=0 porque el Id lo carga la base de datos con un valor autonumerico

            String nombre = ui.getNombre();
            String apellido = ui.getApellido();

            if (existe(nombre, apellido)) {
                throw new ServicioException("Ya existe un jugador con el mismo nombre");
            }

            String telefono = ui.getTelefono();

            //Direccion
            Ciudad ciudad = null;
            ciudad = new Ciudad(ui.getIdCiudad(), ui.getNombreCiudad());
            String calle = ui.getCalle();
            int numero = ui.getNumero();
            String piso = ui.getPiso();
            String departamento = ui.getDepartamento();
            int dni = ui.getDni();
            Date fechaNacimiento = ui.getFechaNacimiento();
            String sexo = ui.getSexo();

            Direccion direccion = null;

            //if (!calle.equals("")|| numero > 0 || !piso.equals("")  || !departamento.equals("") ){
            direccion = new Direccion(ciudad, calle, numero, piso, departamento);
            //}

            Jugador jugador = new Jugador(id, nombre, apellido, telefono, direccion, dni, fechaNacimiento, sexo);



            IJugadorRepositorio repo;

            try {
                repo = fabricaDb.getJugadorRepositorio();
                repo.agregar(jugador);

            } catch (RepositorioException e) {
                throw new ServicioException("Fallo la incorporacion del jugador: " + e.getMessage(), e);
            }
        } catch (Exception e) {
            throw new ServicioException("Fallo la incorporacion del jugador: " + e.getMessage(), e);
        }

    }

    @Override
    public void listarTodos(IUsuarioInterfazJugador ui) throws ServicioException {
        IJugadorRepositorio repo;

		try {
			
            repo=fabricaDb.getJugadorRepositorio();

            List<Jugador> lista = repo.obtenerTodos();
			ui.setListaJugadores(lista);
		} catch (RepositorioException e) {
			throw new ServicioException("Fallo el listado de jugador", e) ;
		}
    }

    @Override
    public void eliminar(IUsuarioInterfazJugador ui) throws ServicioException {
        try {
            int id = ui.getId();

            if(asignadoEnEquipo(id)){
                throw new ServicioException("El jugador a eliminar pertenece a un equipo");
            }
            String nombre = ui.getNombre();
            String apellido = ui.getApellido();
            String telefono = ui.getTelefono();

            //Direccion
            Ciudad ciudad = null;
            ciudad = new Ciudad(ui.getIdCiudad(), ui.getNombreCiudad());
            String calle = ui.getCalle();
            int numero = ui.getNumero();
            String piso = ui.getPiso();
            String departamento = ui.getDepartamento();
            int dni = ui.getDni();
            Date fechaNacimiento = ui.getFechaNacimiento();
            String sexo = ui.getSexo();

            Direccion direccion = null;

            //if (!calle.equals("")|| numero > 0 || !piso.equals("")  || !departamento.equals("") ){
            direccion = new Direccion(ciudad, calle, numero, piso, departamento);
            //}

            Jugador jugador = new Jugador(id, nombre, apellido, telefono, direccion, dni, fechaNacimiento, sexo);

            IJugadorRepositorio repo;

            try {
                repo = fabricaDb.getJugadorRepositorio();
                repo.eliminar(jugador);

            } catch (RepositorioException e) {
                throw new ServicioException("Fallo la eliminacion del jugador:" + ciudad.getNombre(), e);
            }
        } catch (Exception e) {
            throw new ServicioException(e.getMessage(), e);
        }
    }

    @Override
    public void modificar(IUsuarioInterfazJugador ui) throws ServicioException {
        try {
            int id = ui.getId();
            String nombre = ui.getNombre();
            String apellido = ui.getApellido();
            String telefono = ui.getTelefono();

            //Direccion
            Ciudad ciudad = null;
            ciudad = new Ciudad(ui.getIdCiudad(), ui.getNombreCiudad());
            String calle = ui.getCalle();
            int numero = ui.getNumero();
            String piso = ui.getPiso();
            String departamento = ui.getDepartamento();
            int dni = ui.getDni();
            Date fechaNacimiento = ui.getFechaNacimiento();
            String sexo = ui.getSexo();

            Direccion direccion = null;

            //if (!calle.equals("")|| numero > 0 || !piso.equals("")  || !departamento.equals("") ){
            direccion = new Direccion(ciudad, calle, numero, piso, departamento);
            //}

            Jugador jugador = new Jugador(id, nombre, apellido, telefono, direccion, dni, fechaNacimiento, sexo);

            IJugadorRepositorio repo;

            try {
                repo = fabricaDb.getJugadorRepositorio();
                repo.modificar(jugador);

            } catch (RepositorioException e) {
                throw new ServicioException("Fallo la incorporacion del jugador: " + e.getMessage(), e);
            }
        } catch (Exception e) {
            throw new ServicioException("Fallo la incorporacion del jugador: " + e.getMessage(), e);
        }
        
    }

    @Override
    public void listarAlgunos(IUsuarioInterfazJugador ui, String nombre, String apellido) throws ServicioException {
        IJugadorRepositorio repo;

		try {
			
            repo=fabricaDb.getJugadorRepositorio();
           
            String[] parametrosBusqueda = {nombre,apellido};
           
            /*
            parametrosBusqueda= "jugador.nombre like '%"
                + nombre
                + "%' and jugador.apellido like '%"
                + apellido + "%'" ;
             * */
            List<Jugador> lista = repo.obtenerAlgunos(parametrosBusqueda);
			ui.setListaJugadores(lista);
		} catch (RepositorioException e) {
			throw new ServicioException("Fallo el listado de jugador (Busqueda)", e) ;
		}
    }

    @Override
    public boolean existe(String nombre, String apellido) throws ServicioException {
        IJugadorRepositorio repo;

		try {

            repo=fabricaDb.getJugadorRepositorio();

            String[] parametrosBusqueda = {nombre, apellido};

            return repo.existe(parametrosBusqueda);

		} catch (RepositorioException e) {

			throw new ServicioException(e.getMessage(), e) ;
		}
    }

    @Override
    public boolean asignadoEnEquipo(int idJugador) throws ServicioException {
        IJugadorRepositorio repo;

        try {

            repo = fabricaDb.getJugadorRepositorio();

            return repo.asignadoEnEquipo(idJugador);

        } catch (RepositorioException e) {

            throw new ServicioException(e.getMessage(), e);
        }
    }
   
}
